home *** CD-ROM | disk | FTP | other *** search
/ Gamers Delight 2 / Gamers Delight 2.iso / Aminet / game / role / pinfocom_3_0.lha / Source / infocom.c < prev    next >
C/C++ Source or Header  |  1992-10-22  |  8KB  |  348 lines

  1. /* infocom.c
  2.  *
  3.  *  ``pinfocom'' -- a portable Infocom Inc. data file interpreter.
  4.  *  Copyright (C) 1987-1992  InfoTaskForce
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; see the file COPYING.  If not, write to the
  18.  *  Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20.  
  21. /*
  22.  * $Header: RCS/infocom.c,v 3.0 1992/10/21 16:56:19 pds Stab $
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <ctype.h>
  28. #include <errno.h>
  29. #include <time.h>
  30.  
  31. #include "infocom.h"
  32. #include "patchlevel.h"
  33.  
  34. #define COPYRIGHT   "\n\
  35.     This program comes with ABSOLUTELY NO WARRANTY.\n\
  36.     This program is free software, and you are welcome to redistribute it\n\
  37.     under certain conditions; see the file COPYING in the source directory\n\
  38.     for full details.\n"
  39.  
  40. #define USAGE       "Usage: %-8s [-aAehoOpPstTvV] [-c context] [-i indent] [-l lines]\n\t\t[-m margin] [-r savefile] "
  41. #define OPTIONS     "aAc:ehi:l:m:oOpPr:stTvV"
  42.  
  43. #ifndef RMARGIN
  44. #define RMARGIN 2
  45. #endif
  46. #ifndef LMARGIN
  47. #define LMARGIN 0
  48. #endif
  49. #ifndef CONTEXT
  50. #define CONTEXT 2
  51. #endif
  52.  
  53. header_t    data_head;
  54. obj_info_t  objd;
  55. gflags_t    gflags;
  56. file_t      file_info;
  57.  
  58. word        random1;
  59. word        random2;
  60. word        pc_offset;
  61. word        pc_page;
  62. word        resident_blocks;
  63. word        save_blocks;
  64.  
  65. byte        *base_ptr;
  66. byte        *base_end;
  67. byte        *vocab;
  68. byte        *global_ptr;
  69. byte        *end_res_p;
  70. word        *stack_base;
  71. word        *stack_var_ptr;
  72. word        *stack;
  73.  
  74. byte        *prog_block_ptr;
  75.  
  76. /* Score Routine Variables */
  77.  
  78. char        *ti_location;
  79. char        *ti_status;
  80.  
  81. /* Input Routine Variables */
  82.  
  83. byte        *wsbf_strt;
  84. byte        *end_of_sentence;
  85. word        num_vocab_words;
  86. word        vocab_entry_size;
  87. byte        *strt_vocab_table;
  88. byte        *end_vocab_table;
  89.  
  90. /* Print Routine Variables */
  91.  
  92. byte        *common_word_ptr;
  93. print_buf_t *pbf_p;
  94.  
  95. char ws_table[] = { ' ','\t','\r','.',',','?','\0','\0' };
  96.  
  97. char table[] =
  98. {
  99.     'a','b','c','d','e','f','g','h','i','j','k','l','m',
  100.     'n','o','p','q','r','s','t','u','v','w','x','y','z',
  101.     'A','B','C','D','E','F','G','H','I','J','K','L','M',
  102.     'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
  103.     ' ',' ','0','1','2','3','4','5','6','7','8','9','.',
  104.     ',','!','?','_','#','\'','"','/','\\','-',':','(',')',
  105.     '\0','\0'
  106. };
  107.  
  108.  
  109. static void
  110. usage A1(const char *, name)
  111. {
  112.     extern const char *scr_usage;
  113.     extern const char *scr_long_usage;
  114.  
  115.     const char *cp;
  116.  
  117.     for (cp = &name[strlen(name)-1];
  118.          cp>=name && (isalnum(*cp) || (*cp=='.') || (*cp=='_') || (*cp=='-'));
  119.          --cp)
  120.     {}
  121.  
  122.     fprintf(stdout, USAGE, cp+1);
  123.     fprintf(stdout, "%s%s[filename]\n",
  124.             scr_usage, *scr_usage ? " " : "");
  125.  
  126.     fprintf(stdout,
  127.            "\nPortable Infocom Datafile Interpreter:  Version %d.%d\n",
  128.            VERSION, PATCHLEVEL);
  129.     puts(COPYRIGHT);
  130.  
  131.     puts("\
  132. \t-h\toutput the data file header\n\
  133. \t-o\toutput object names, attributes and links\n\
  134. \t-O\toutput object tree\n\
  135. \t-v\toutput the game vocabulary\n\
  136. \t-V\tverify the game data file\n\n\
  137. \t-a\tdisplay changes to object attributes while playing\n\
  138. \t-A\tdisplay value tests of object attributes while playing\n\
  139. \t-c #\tset # of context lines to keep when paging\n\
  140. \t-e\techo each command before executing\n\
  141. \t-i #\tindent game output # of spaces\n\
  142. \t-l #\tset # of screen lines\n\
  143. \t-m #\tset # of spaces as right margin\n\
  144. \t-p\tdon't page long output\n\
  145. \t-P\tset alternate prompt flag\n\
  146. \t-r file\trestore saved game file after starting up\n\
  147. \t-s\tdon't display status line\n\
  148. \t-t\tdisplay changes to object tree while playing\n\
  149. \t-T\tset Tandy licensing flag\n");
  150.  
  151.     if (scr_long_usage != NULL)
  152.         puts(scr_long_usage);
  153. }
  154.  
  155.  
  156. void
  157. seed_random()
  158. {
  159.     extern word     random1;
  160.     extern word     random2;
  161. #ifdef NO_RANDOM
  162.     random1 = 0xFFFF;
  163.     random2 = 0xFFFF;
  164. #else
  165.     random1 = time(0) >> 16;
  166.     random2 = time(0) & 0xFFFF;
  167. #endif
  168. }
  169.  
  170.  
  171. int
  172. main A2(int, argc, char **, argv)
  173. {
  174.     extern int atoi P((const char *));
  175.     extern int getopt P((int, char* const*, const char *));
  176.     extern int  optind;
  177.     extern char *optarg;
  178.  
  179.     extern char sname[];
  180.     extern const char *scr_opt_list;
  181.  
  182.     char        *cmd_name;
  183.     char        *optlist;
  184.     char        *snm    = NULL;
  185.     Bool        head    = 0;
  186.     Bool        objs    = 0;
  187.     Bool        vocab1  = 0;
  188.     Bool        tree    = 0;
  189.     Bool        verfy   = 0;
  190.     Bool        play    = 1;
  191.     Bool        prompt  = 0;
  192.     Bool        tandy   = 0;
  193.     int         margin  = RMARGIN;
  194.     int         indent  = LMARGIN;
  195.     int         lines   = 0;
  196.     int         context = CONTEXT;
  197.     int         width;
  198.     int         c;
  199.  
  200.     cmd_name = argv[0];
  201.  
  202.     if ((argc = scr_cmdarg(argc, &argv)) == 0)
  203.     {
  204.         usage(cmd_name);
  205.         return (1);
  206.     }
  207.  
  208.     gflags.filenm = NULL;
  209.     gflags.paged = 1;
  210.     gflags.pr_status = 1;
  211.  
  212.     optlist = xmalloc(sizeof(OPTIONS) + strlen(scr_opt_list));
  213.  
  214.     strcpy(optlist, OPTIONS);
  215.     strcat(optlist, scr_opt_list);
  216.  
  217.     while ((c = getopt(argc, argv, optlist)) != -1)
  218.     {
  219.         switch (c)
  220.         {
  221.             case 'a':
  222.                 gflags.pr_attr = 1;
  223.                 break;
  224.             case 'A':
  225.                 gflags.pr_atest = 1;
  226.                 break;
  227.             case 'c':
  228.                 context = atoi(optarg);
  229.                 break;
  230.             case 'e':
  231.                 gflags.echo = 1;
  232.                 break;
  233.             case 'h':
  234.                 head = 1;
  235.                 play = 0;
  236.                 break;
  237.             case 'i':
  238.                 indent = atoi(optarg);
  239.                 break;
  240.             case 'l':
  241.                 lines = atoi(optarg);
  242.                 break;
  243.             case 'm':
  244.                 margin = atoi(optarg);
  245.                 break;
  246.             case 'o':
  247.                 objs = 1;
  248.                 play = 0;
  249.                 break;
  250.             case 'O':
  251.                 tree = 1;
  252.                 play = 0;
  253.                 break;
  254.             case 'p':
  255.                 gflags.paged = 0;
  256.                 break;
  257.             case 'P':
  258.                 prompt = 1;
  259.                 break;
  260.             case 'r':
  261.                 snm = optarg;
  262.                 break;
  263.             case 's':
  264.                 gflags.pr_status = 0;
  265.                 break;
  266.             case 't':
  267.                 gflags.pr_xfers = 1;
  268.                 break;
  269.             case 'T':
  270.                 tandy = 1;
  271.                 break;
  272.             case 'v':
  273.                 vocab1 = 1;
  274.                 play = 0;
  275.                 break;
  276.             case 'V':
  277.                 verfy = 1;
  278.                 play = 0;
  279.                 break;
  280.             default:
  281.                 scr_getopt(c, optarg);
  282.                 break;
  283.  
  284.             case '?':
  285.                 usage(cmd_name);
  286.                 return (1);
  287.         }
  288.     }
  289.  
  290.     gflags.game_state = NOT_INIT;
  291.  
  292.     width = scr_setup(margin, indent, lines, context);
  293.  
  294.     /*
  295.      * Open the game file, if possible...
  296.      */
  297.     if ((argc > optind+1)
  298.         || ((gflags.filenm = open_file(argv[optind])) == NULL))
  299.     {
  300.         usage(cmd_name);
  301.         return (1);
  302.     }
  303.  
  304.     init();
  305.  
  306.     if (play)
  307.     {
  308.         check_version();
  309.  
  310.         scr_begin();
  311.  
  312.         gflags.game_state = INIT_GAME;
  313.  
  314.         if (snm != NULL)
  315.         {
  316.             strcpy(sname, snm);
  317.             restore();
  318.             gflags.game_state = PLAY_GAME;
  319.         }
  320.         else
  321.             change_status();
  322.  
  323.         if (tandy)
  324.             F1_SETB(B_TANDY);
  325.         if (prompt)
  326.             F1_SETB(B_ALT_PROMPT);
  327.  
  328.         interp();
  329.  
  330.         scr_end();
  331.     }
  332.     else
  333.     {
  334.         if (snm != NULL)
  335.         {
  336.             strcpy(sname, snm);
  337.             restore();
  338.         }
  339.  
  340.         pbf_p->max = width;
  341.         options(verfy, head, objs, vocab1, tree);
  342.     }
  343.  
  344.     scr_shutdown();
  345.  
  346.     return (0);
  347. }
  348.